
; B5MM-1.INS - BYE5 insert for MicroMint SB180 computer - 03/17/86
;
;	    Note:  This is an insert, not an overlay.
;
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
; 03/17/86  Converted to 8080 source code, as BYE5 is not written in
;	    Zilog Z80 mnemonics.  Can now be assembled with ASM.COM or
;	    other 8080 assemblers.  Renamed to B5MM for "MicroMint" as
;	    there is already a B5SB for the Super Brain computer.
;					- Irv Hoff
;
; 10/08/85  Written for use with BYE5.	- Ken Davidson
;
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
; NOTE - There is an anomaly with the HD64180 chip that doesn't allow
;	 the allow the use of its DCD input in a fashion useful to BYE5.
;	 When the DCD input is inactive (false) the chip's receive
;	 register is turned off.  Since the chip cannot receive any
;	 characters with DCD off, it isn't possible to set up a Hayes
;	 compatable modem.  A fix for this is to make a special modem
;	 cable which has pins 5 and 8 reversed.  Assuming the modem's
;	 CTS signal is always active, the chip's DCD line is always on.
;	 The modem's DCD signal then enters the chip through CTS0/.
;	 With CTS off, the chip can send and receive characters, and
;	 the receive register full status works correctly.  However,
;	 the transmit buffer empty status is turned off.  Therefore,
;	 when setting up the modem with DCD off, a delay must be
;	 inserted after each character is sent to ensure the next
;	 character doesn't overrun it.	This fix is something of a
;	 a kludge, but works and is the only way around the problem
;	 without adding more hardware.	Of course, when a carrier is
;	 present, the serial port works correctly.
;
; =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =   =
;
;
PORT	EQU	00H		; Modem control port
MDATIN	EQU	PORT+8		; Data in port
MDATOUT	EQU	PORT+6		; Data out port
MDCTL1	EQU	PORT+4		; Modem status port
;
MDRCV	EQU	80H		; Modem receive ready bit
MDSND	EQU	02H		; Modem send ready bit
MDDCD	EQU	20H		; Data carrier detect
;
CDSTAT	EQU	02H		; Carrier detect status
BRPORT	EQU	02H		; Baud rate generator port
;
IN0	EQU	38EDH		; Special Hitachi op code pair
OUT0	EQU	39EDH		; Special Hitachi op code pair
;
;
; Divisors for the HD64180 baudrate generator
;
BD300	EQU	13		; 300 baud
BD1200	EQU	11		; 1200 bps
BD2400	EQU	10		; 2400 bps
BD9600	EQU	8		; 9600 bps
;
;
;-----------------------------------------------------------------------
;
; See if we still have a carrier - if not, return with the zero flat set
;
MDCARCK:DW	IN0		; Get the status
	DB	CDSTAT
	CMA
	ANI	MDDCD		; Check for carrier
	RET
;.....
;
;
; Disconnect and wait for an incoming call
;
MDINIT:	MVI	A,10H		; Reset channel
	DW	OUT0
	DB	PORT
	PUSH	B		; Save in case it's being used elsewhere
	MVI	B,20		; 2 second delay to drop any carrier
;
OFFTI:	CALL	DELAY		; 1 second delay
	DCR	B
	JNZ	OFFTI		; Keep looping until finished
	POP	B		; Restore 'BC'
	MVI	A,64H		; Turn DTR back on
	DW	OUT0
	DB	PORT
;
	 IF	IMODEM		; If using an intellegent modem
	CALL	IMINIT		; Go initialize it now
	 ENDIF			; IMODEM
;
	RET
;.....
;
;
; Input a character from the modem port
;
MDINP:	DW	IN0		; Get the character
	DB	MDATIN
	RET
;.....
;
;
; Check the status to see if a character is available.	If not, return
; with the zero flag set.  If yes, use 0FFH to clear the flag.
;
MDINST:	DW	IN0		; Get the status
	DB	MDCTL1
	ANI	MDRCV		; Got a character
	RZ			; Return if none
	ORI	0FFH		; Otherwise set the proper flag
	RET
;.....
;
;
; Send a character to the modem
;
MDOUTP:	DW	OUT0
	DB	MDATOUT
	RET
;.....
;
;
; See if the output is ready for another character
;
MDOUTST:DW	IN0		; Get the status
	DB	CDSTAT
	ANI	MDDCD		; Check for carrier
	JZ	MDST1		; Jump if present
	CALL	DELAY
	ORI	0FFH
	RET
;
MDST1:	DW	IN0		; Get the status
	DB	MDCTL1
	ANI	MDSND		; Ready for a character?
	RET
;.....
;
;
; Reinitialize the modem and hang up the phone by dropping DTR and
; leaving it inactive.
;
MDQUIT:	 IF	IMODEM
	CALL	IMQUIT
	 ENDIF			; IMODEM
;
;
; Called by the main program after caller types BYE
;
MDSTOP:	MVI	A,74H		; Turn off DTR until next time
	DW	OUT0
	DB	PORT
	RET
;.....
;
;
; The following routine sets the baud rate.  BYE5 asks for the maximum
; speed you have available.
;
SETINV:	ORI	0FFH		; Make sure zero flag is not set
	RET
;.....
;
;
SET300:	MVI	A,BD300
	JMP	SETBAUD
;
SET1200:MVI	A,BD1200
	JMP	SETBAUD
;
SET2400:MVI	A,BD2400
	JMP	SETBAUD
;
SET9600:MVI	A,BD9600
;.....
;
;
; Sets the baudrate
;
SETBAUD:DW	OUT0
	DB	BRPORT
	XRA	A		; Say baudrate is ok
	RET
;.....
;
;			       end
;-----------------------------------------------------------------------
